//==========================================================================
// Copyright (c) 2000-2008,  Elastos, Inc.  All Rights Reserved.
//==========================================================================
/*
 *
 * Copyright (c) 1987  X Consortium
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
 * X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 * Except as contained in this notice, the name of the X Consortium shall not be
 * used in advertising or otherwise to promote the sale, use or other dealings
 * in this Software without prior written authorization from the X Consortium.
 *
 *
 * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
 *
 *                         All Rights Reserved
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation for any purpose and without fee is hereby granted,
 * provided that the above copyright notice appear in all copies and that
 * both that copyright notice and this permission notice appear in
 * supporting documentation, and that the name of Digital not be
 * used in advertising or publicity pertaining to distribution of the
 * software without specific, written prior permission.
 *
 * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
 * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
 * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
 * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
 * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
 * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
 * SOFTWARE.
 *
 */
#ifndef OS_H
#define OS_H
#include "misc.h"
#define ALLOCATE_LOCAL_FALLBACK(_size) Xalloc((unsigned long)(_size))
#define DEALLOCATE_LOCAL_FALLBACK(_ptr) Xfree((pointer)(_ptr))

#define NullFID ((FID) 0)

#define SCREEN_SAVER_ON   0
#define SCREEN_SAVER_OFF  1
#define SCREEN_SAVER_FORCER 2
#define SCREEN_SAVER_CYCLE  3

#ifndef MAX_REQUEST_SIZE
#define MAX_REQUEST_SIZE 65535
#endif
#ifndef MAX_BIG_REQUEST_SIZE
#define MAX_BIG_REQUEST_SIZE 1048575
#endif

typedef pointer    FID;
typedef struct _FontPathRec *FontPathPtr;
typedef struct _NewClientRec *NewClientPtr;

#define xnfalloc(size) XNFalloc((unsigned long)(size))
#define xnfrealloc(ptr, size) XNFrealloc((pointer)(ptr), (unsigned long)(size))

#define xalloc(size) Xalloc((unsigned long)(size))
#define xnfalloc(size) XNFalloc((unsigned long)(size))
#define xcalloc(_num, _size) Xcalloc((unsigned long)(_num)*(unsigned long)(_size))
#define xrealloc(ptr, size) Xrealloc((pointer)(ptr), (unsigned long)(size))
#define xnfrealloc(ptr, size) XNFrealloc((pointer)(ptr), (unsigned long)(size))
//#define xfree(ptr) Xfree((pointer)(ptr))
#define xfree(ptr) do { if (ptr) {free ((char*)ptr); ptr = NULL;}} while (0)

#ifndef X_NOT_STDC_ENV
#include <string.h>
#endif

/* have to put $(SIGNAL_DEFINES) in DEFINES in Imakefile to get this right */
#ifdef SIGNALRETURNSINT
#define SIGVAL int
#else
#define SIGVAL void
#endif

//#ifdef __cplusplus   // use extern C only for C++ compiler.
//extern "C"  {
//#endif

extern _ELASTOS Boolean OsDelayInitColors;

extern int WaitForSomething(
    int* /*pClientsReady*/
);

#ifdef LBX
#define ReadRequestFromClient(client)   ((client)->readRequest(client))
extern int StandardReadRequestFromClient(
    ClientPtr /*client*/
);
#else
extern int ReadRequestFromClient(
    ClientPtr /*client*/
);
#endif /* LBX */

extern _ELASTOS Boolean InsertFakeRequest(
    ClientPtr /*client*/,
    char* /*data*/,
    int /*count*/
);

extern int ResetCurrentRequest(
    ClientPtr /*client*/
);

extern void FlushAllOutput(
    void
);

extern void FlushIfCriticalOutputPending(
    void
);

extern void SetCriticalOutputPending(
    void
);

extern int WriteToClient(
    ClientPtr /*who*/,
    int /*count*/,
    char* /*buf*/
);

extern void ResetOsBuffers(
    void
);

extern void CreateWellKnownSockets(
    void
);

extern void ResetWellKnownSockets(
    void
);

extern XID
AuthorizationIDOfClient(
    ClientPtr /*client*/
);

extern char *ClientAuthorized(
    ClientPtr /*client*/,
    unsigned int /*proto_n*/,
    char* /*auth_proto*/,
    unsigned int /*string_n*/,
    char* /*auth_string*/
);

extern _ELASTOS Boolean EstablishNewConnections(
    ClientPtr /*clientUnused*/,
    pointer /*closure*/
);

extern void CheckConnections(
    void
);

extern void CloseDownConnection(
    ClientPtr /*client*/
);

extern int AddEnabledDevice(
    int /*fd*/
);

extern int RemoveEnabledDevice(
    int /*fd*/
);

extern int OnlyListenToOneClient(
    ClientPtr /*client*/
);

extern int ListenToAllClients(
    void
);

extern int IgnoreClient(
    ClientPtr /*client*/
);

extern int AttendClient(
    ClientPtr /*client*/
);

extern int MakeClientGrabImpervious(
    ClientPtr /*client*/
);

extern int MakeClientGrabPervious(
    ClientPtr /*client*/
);

extern void Error(
    char* /*str*/
);

extern CARD32 GetTimeInMillis(
    void
);

extern int AdjustWaitForDelay(
    pointer /*waitTime*/,
    unsigned long /*newdelay*/
);

typedef    struct _OsTimerRec *OsTimerPtr;

typedef CARD32 (*OsTimerCallback)(
    OsTimerPtr /* timer */,
    CARD32 /* time */,
    pointer /* arg */
);

extern void TimerInit(
    void
);

extern _ELASTOS Boolean TimerForce(
    OsTimerPtr /* timer */
);

#define TimerAbsolute (1<<0)
#define TimerForceOld (1<<1)

extern OsTimerPtr TimerSet(
    OsTimerPtr /* timer */,
    int /* flags */,
    CARD32 /* millis */,
    OsTimerCallback /* func */,
    pointer /* arg */
);

extern void TimerCheck(
    void
);

extern void TimerCancel(
    OsTimerPtr /* pTimer */
);

extern void TimerFree(
    OsTimerPtr /* pTimer */
);

extern SIGVAL AutoResetServer(
    int /*sig*/
);

extern SIGVAL GiveUp(
    int /*sig*/
);

extern void UseMsg(
    void
);

extern void ProcessCommandLine(
    int /*argc*/,
    char* /*argv*/[]
);

extern unsigned long *Xalloc(
    unsigned long /*amount*/
);

extern unsigned long *XNFalloc(
    unsigned long /*amount*/
);

extern unsigned long *Xcalloc(
    unsigned long /*amount*/
);

extern unsigned long *Xrealloc(
    pointer /*ptr*/,
    unsigned long /*amount*/
);

extern unsigned long *XNFrealloc(
    pointer /*ptr*/,
    unsigned long /*amount*/
);

extern void Xfree(
    pointer /*ptr*/
);

extern void OsInitAllocator(
    void
);

typedef SIGVAL (*OsSigHandlerPtr)(
    int /* sig */
);

extern OsSigHandlerPtr OsSignal(
    int /* sig */,
    OsSigHandlerPtr /* handler */
);

extern int auditTrailLevel;

extern void AuditF(
#if NeedVarargsPrototypes
    char* /*f*/,
    ...
#endif
);

extern void FatalError(
#if NeedVarargsPrototypes
    char* /*f*/,
    ...
#endif
)
#if __GNUC__ == 2 && __GNUC_MINOR__ > 4
__attribute((noreturn))
#endif
;

extern void ErrorF(
    char* /*f*/,
    ...
);

#ifdef SERVER_LOCK
extern void LockServer(
    void
);

extern void UnlockServer(
    void
);
#endif

extern int OsLookupColor(
    int    /*screen*/,
    char * /*name*/,
    unsigned /*len*/,
    unsigned short * /*pred*/,
    unsigned short * /*pgreen*/,
    unsigned short * /*pblue*/
);

extern void OsInit(
    void
);

extern void OsCleanup(
    void
);

extern void OsVendorFatalError(
    void
);

extern void OsVendorInit(
    void
);

extern int OsInitColors(
    void
);

extern int AddHost(
    ClientPtr    /*client*/,
    int         /*family*/,
    unsigned    /*length*/,
    pointer     /*pAddr*/
);

extern _ELASTOS Boolean ForEachHostInFamily (

    int        /*family*/,
    _ELASTOS Boolean    (* /*func*/ )(),
    pointer /*closure*/
);

extern int RemoveHost(
    ClientPtr    /*client*/,
    int         /*family*/,
    unsigned    /*length*/,
    pointer     /*pAddr*/
);

extern int GetHosts(
    pointer * /*data*/,
    int        * /*pnHosts*/,
    int        * /*pLen*/,
    _ELASTOS Boolean    * /*pEnabled*/
);

typedef struct sockaddr * sockaddrPtr;

extern int InvalidHost(
    sockaddrPtr /*saddr*/,
    int        /*len*/
);

extern int LocalClient(
    ClientPtr /* client */
);

extern int ChangeAccessControl(
    ClientPtr /*client*/,
    int /*fEnabled*/
);

extern int GetAccessControl(
    void
);


extern void AddLocalHosts(
    void
);

extern void ResetHosts(
    char *display
);

extern void EnableLocalHost(
    void
);

extern void DisableLocalHost(
    void
);

extern void AccessUsingXdmcp(
    void
);

extern void DefineSelf(
    int /*fd*/
);

extern void AugmentSelf(
    pointer /*from*/,
    int /*len*/
);

extern void InitAuthorization(
    char * /*filename*/
);

extern int LoadAuthorization(
    void
);

extern void RegisterAuthorizations(
    void
);

extern XID CheckAuthorization(
    unsigned int /*namelength*/,
    char * /*name*/,
    unsigned int /*datalength*/,
    char * /*data*/,
    ClientPtr /*client*/,
    char ** /*reason*/
);

extern void ResetAuthorization(
    void
);

extern int AddAuthorization(
    unsigned int /*name_length*/,
    char * /*name*/,
    unsigned int /*data_length*/,
    char * /*data*/
);

extern XID GenerateAuthorization(
    unsigned int   /* name_length */,
    char    *  /* name */,
    unsigned int   /* data_length */,
    char    *  /* data */,
    unsigned int * /* data_length_return */,
    char    ** /* data_return */
);

extern void ExpandCommandLine(
    int * /*pargc*/,
    char *** /*pargv*/
);

extern int ddxProcessArgument(
    int /*argc*/,
    char * /*argv*/ [],
    int /*i*/
);

/*
 *  idiom processing stuff
 */

xReqPtr PeekNextRequest(
    xReqPtr req, ClientPtr client, _ELASTOS Boolean readmore
);

void SkipRequests(
    xReqPtr req, ClientPtr client, int numskipped
);

/* int ReqLen(xReq *req, ClientPtr client)
 * Given a pointer to a *complete* request, return its length in bytes.
 * Note that if the request is a big request (as defined in the Big
 * Requests extension), the macro lies by returning 4 less than the
 * length that it actually occupies in the request buffer.  This is so you
 * can blindly compare the length with the various sz_<request> constants
 * in Xproto.h without having to know/care about big requests.
 */
#define ReqLen(_pxReq, _client) \
 ((_pxReq->length ? \
     (_client->swapped ? lswaps(_pxReq->length) : _pxReq->length) \
  : ((_client->swapped ? \
    lswapl(((CARD32*)_pxReq)[1]) : ((CARD32*)_pxReq)[1])-1) \
  ) << 2)

/* otherReqTypePtr CastxReq(xReq *req, otherReqTypePtr)
 * Cast the given request to one of type otherReqTypePtr to access
 * fields beyond the length field.
 */
#define CastxReq(_pxReq, otherReqTypePtr) \
    (_pxReq->length ? (otherReqTypePtr)_pxReq \
            : (otherReqTypePtr)(((CARD32*)_pxReq)+1))

/* stuff for SkippedRequestsCallback */
extern CallbackListPtr SkippedRequestsCallback;
typedef struct {
    xReqPtr req;
    ClientPtr client;
    int numskipped;
} SkippedRequestInfoRec;

/* stuff for ReplyCallback */
extern CallbackListPtr ReplyCallback;
typedef struct {
    ClientPtr client;
    pointer replyData;
    unsigned long dataLenBytes;
    unsigned long bytesRemaining;
    _ELASTOS Boolean startOfReply;
} ReplyInfoRec;

/* stuff for FlushCallback */
extern CallbackListPtr FlushCallback;

//#ifdef __cplusplus   // use extern C only for C++ compiler.
//}
//#endif

#endif /* OS_H */
